Program generador;

uses crt;

type
    TValores = (secuencial,azar);

procedure crearEnteros(nombre:string[8]);
var i, inf, sup, cant: integer;
   arch: file of integer;
   tipoVal:char;
   tipoValor:TValores;
begin
     write('Desea generar valores al azar o secuenciales (A/S):');
     repeat
           tipoVal := readkey;
     until upcase(tipoVal) in ['A','S'];
     if upcase(tipoVal) = 'A' then
        TipoValor := azar
     else
         TipoValor := secuencial;

     writeln;
     write('Ingrese el valor mínimo a utilizar:');
     readln(inf);
     write('Ingrese el valor máximo a utilizar:');
     readln(sup);

     assign(arch, nombre+'.dat');
     rewrite(arch);

     case tipoValor of
          secuencial:
                     begin
                          writeln('Se van a generar ',sup-inf+1,' valores.');
                          for i := inf to sup do
                              write(arch,i);
                     end;
          azar:
                     begin
                          randomize;
                          write('Ingrese la cantidad de valores a generar:');
                          readln(cant);
                          for i := 1 to cant do
                              write(arch,random(sup-inf+1)+inf);
                     end;
     end;
     close(arch);

     writeln;
     writeln('El contenido del archivo es el siguiente:');
     reset(arch);
     while not eof(arch) do
     begin
          read(arch,i);
          write(i,' ');
     end;
     close(arch);
end;

procedure crearCaracteres(nombre:string[8]);
var i, cant: integer;
   arch: file of char;
   inf, sup, tipoVal, c:char;
   tipoValor:TValores;
begin
     write('Desea generar valores al azar o secuenciales (A/S):');
     repeat
           tipoVal := readkey;
     until upcase(tipoVal) in ['A','S'];
     if upcase(tipoVal) = 'A' then
        TipoValor := azar
     else
         TipoValor := secuencial;

     writeln;
     write('Ingrese el valor mínimo a utilizar:');
     readln(inf);
     write('Ingrese el valor máximo a utilizar:');
     readln(sup);

     assign(arch, nombre+'.dat');
     rewrite(arch);

     case tipoValor of
          secuencial:
                     begin
                          writeln('Se van a generar ',ord(sup)-ord(inf)+1,' valores.');
                          for i := ord(inf) to ord(sup) do
                              write(arch,chr(i));
                     end;
          azar:
                     begin
                          randomize;
                          write('Ingrese la cantidad de valores a generar:');
                          readln(cant);
                          for i := 1 to cant do
                              write(arch,chr(random(ord(sup)-ord(inf)+1)+ord(inf)));
                     end;
     end;
     close(arch);

     writeln;
     writeln('El contenido del archivo es el siguiente:');
     reset(arch);
     while not eof(arch) do
     begin
          read(arch,c);
          write(c,' ');
     end;
     close(arch);
end;

procedure crearReales(nombre:string[8]);
var i, inf, sup, cant: integer;
    r:real;
    arch: file of real;
begin
     writeln;
     write('Ingrese un valor entero a utilizar como cota inferior:');
     readln(inf);
     write('Ingrese un valor entero a utilizar como cota superior:');
     readln(sup);
     write('Ingrese la cantidad de valores a generar:');
     readln(cant);

     assign(arch, nombre+'.dat');
     rewrite(arch);
     writeln('Se van a generar ',cant,' valores aleatorios.');
     for i := 1 to cant do
         write(arch,(random(sup-inf)+inf)+random);
     close(arch);

     writeln;
     writeln('El contenido del archivo es el siguiente:');
     reset(arch);
     while not eof(arch) do
     begin
          read(arch,r);
          write(r:8:2,' ');
     end;
     close(arch);
end;


var
   tipoArch, c : char;
   nombre: string[8];
   i : integer;
begin
     write('Seleccione el tipo de archivo a generar (I/R/C):');
     repeat
           tipoArch := readkey;
     until upcase(tipoArch) in ['I','R','C'];
     writeln;

     repeat
          write('Ingrese el nombre del archivo a generar (8 caracteres):');
          readln(nombre);
     until nombre <> '';

     case upcase(tipoArch) of
          'I': crearEnteros(nombre);
          'R': crearReales(nombre);
          'C': crearCaracteres(nombre);
     end;

     readln;
end.

